package com.yaoandw.util;

import java.security.MessageDigest;

public class Md5Encode {
	/**
	 * 将byte数组转换为表示16进制值的字符串， 如：byte[]{8,18}转换为：0813， 和public static byte[]
	 * hexStr2ByteArr(String strIn) 互为可逆的转换过程
	 * 
	 * @param arrB
	 *            需要转换的byte数组
	 * @return 转换后的字符串
	 * @throws Exception
	 *             本方法不处理任何异常，所有异常全部抛出
	 */
	private static String byteArr2HexStr(byte[] arrB) throws Exception {
		int iLen = arrB.length;
		// 每个byte用两个字符才能表示，所以字符串的长度是数组长度的两倍
		StringBuffer sb = new StringBuffer(iLen * 2);
		for (int i = 0; i < iLen; i++) {
			int intTmp = arrB[i];
			// 把负数转换为正数
			while (intTmp < 0) {
				intTmp = intTmp + 256;
			}
			// 小于0F的数需要在前面补0
			if (intTmp < 16) {
				sb.append("0");
			}
			sb.append(Integer.toString(intTmp, 16));
		}
		return sb.toString();
	}


	/**
	 * Encodes a string by md5
	 * 
	 * @param key
	 * @return
	 */
	public static String md5(String key) {
		try {
			return byteArr2HexStr(md5(key.getBytes()));
			// return byte2hex(md5(key.getBytes()));
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	private static byte[] md5(byte[] key) {
		MessageDigest md;
		try {
			md = MessageDigest.getInstance("md5");
			// md.reset();
			md.update(key);
			return md.digest();
		} catch (Exception e) {
			// @TODO 自动生成 catch 块
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 采用Md5进行加密
	 * 
	 * @param baseString
	 * @return
	 */
	public static String encode(String baseString) {
		return md5(baseString);
	}
}
